/**
 * Author : Jorge Mejuto Create : 27/05/2009
 */

package net.eyra.negocio.explotacion.produccion;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import net.eyra.negocio.aplicacion.Constantes;
import net.eyra.negocio.dao.ExplotacionDao;
import net.eyra.negocio.dao.EyraDaoException;
import net.eyra.negocio.entidades.explotacion.Lectura;
import net.eyra.negocio.entidades.explotacion.Tarificador;
import net.eyra.negocio.entidades.gestion.Usuario;
import net.eyra.utiles.FicheroException;
import net.eyra.utiles.FormateoFechaException;
import net.eyra.utiles.Periodo;
import net.eyra.utiles.Zip;

public class Informes {

    /**
     * @param path_fichero
     *            Directorio donde se va a guardar el fichero generado
     * @param nombre_fichero
     *            Nombre del fichero generado.
     * @param id_parques
     *            Lista de los identificadores de los parques para los cuales queremos generar el informe.
     * @param fecha_inicial
     *            Fecha de inicio de la consulta. Incluída en la respuesta.
     * @param fecha_final
     *            Fecha de final de la consulta. Incluída en la respuesta.
     * @param origen_datos
     *            Si son datos del Registrador Princial o Secundario.
     * @param curvas_carga
     *            Si queremos TM1 o TM2 o ambas.
     * @param resumen_diario
     *            Si queremos totalizar por día.
     * @param calculo_reactiva
     *            Si queremos el cálculo de reactiva.
     * @throws FormateoFechaException
     * @throws FicheroException
     *             Problemas al crear el fichero ZIP.
     */
    public void ExportarCurvasCarga(Usuario usuario, String path_fichero, String nombre_fichero, String[] id_tarificadores, Date fecha_inicial,
                                    Date fecha_final, int origen_datos, int curvas_carga, boolean resumen_diario, boolean calculo_reactiva)
                                                                                                                                           throws FormateoFechaException,
                                                                                                                                           FicheroException,
                                                                                                                                           EyraDaoException {

        Periodo periodo = new Periodo(fecha_inicial, fecha_final);

        ExplotacionDao e_dao = new ExplotacionDao();
        CurvasDeCargaAExcel excel = new CurvasDeCargaAExcel();

        List<String> ficheros = new ArrayList<String>(id_tarificadores.length);

        for (int x = 0; x < id_tarificadores.length; x++) {
            Tarificador tarificador = e_dao.getTarificador(Integer.parseInt(id_tarificadores[x]));

            // Se comprueba si hay que generar Resumen Diario
            if (resumen_diario) {
                List<Lectura> lecturas = e_dao.RecuperarLecturasPorDia(tarificador.getId_tarificador(), periodo, true);
                excel.generarHojaDia((ArrayList<Lectura>) lecturas, false);
            }

            // Se comprueba si hay que generar TM1
            if (curvas_carga == Constantes.CURVAS_CARGA_TM1 || curvas_carga == Constantes.CURVAS_CARGA_TM1_TM2) {
                List<Lectura> lecturas = e_dao.RecuperarLecturas(tarificador.getId_tarificador(), periodo, true);
                excel.generarHoja((ArrayList<Lectura>) lecturas, "TM1", calculo_reactiva, tarificador.getConsigna().getId_consigna());
            }

            // Se comprueba si hay que generar TM2
            if (curvas_carga == Constantes.CURVAS_CARGA_TM2 || curvas_carga == Constantes.CURVAS_CARGA_TM1_TM2) {
                List<Lectura> lecturas = e_dao.RecuperarLecturas(tarificador.getId_tarificador(), periodo, false);
                excel.generarHoja((ArrayList<Lectura>) lecturas, "TM2", calculo_reactiva, tarificador.getConsigna().getId_consigna());
            }

            String nombre_fichero_xls = path_fichero + tarificador.getParque().getNombre().toUpperCase().replaceAll("Ñ", "N");
            if (tarificador.getOrden() != 1)
                nombre_fichero_xls += "_(" + tarificador.getNombre().toUpperCase().replaceAll(" ", "_").replaceAll("Ñ", "N") + ")";
            switch (curvas_carga) {
                case Constantes.CURVAS_CARGA_TM1:
                    nombre_fichero_xls += "_TM1";
                    break;
                case Constantes.CURVAS_CARGA_TM2:
                    nombre_fichero_xls += "_TM2";
                    break;
                case Constantes.CURVAS_CARGA_TM1_TM2:
                    nombre_fichero_xls += "_TM1_TM2";
                    break;
            }
            nombre_fichero_xls += "_del "
                    + periodo.getFechaFormateada(Periodo.FORMATO_FECHA_AAAA_MM_DD, Periodo.FECHA_INICIAL, Periodo.SEPARADOR_FECHA_GUION) + " al "
                    + periodo.getFechaFormateada(Periodo.FORMATO_FECHA_AAAA_MM_DD, Periodo.FECHA_FINAL, Periodo.SEPARADOR_FECHA_GUION) + ".xls";

            ficheros.add(nombre_fichero_xls);

            excel.grabarFichero(nombre_fichero_xls);
        }

        CrearZIP(path_fichero, nombre_fichero, ficheros);

        for (String fichero : ficheros) {
            File file = new File(fichero);
            file.delete();
        }
    }

    private void CrearZIP(String path_fichero, String nombre_fichero, List<String> ficheros_excel) throws FicheroException {
        Zip zip = new Zip();
        String[] ficheros = (String[]) ficheros_excel.toArray(new String[0]);
        zip.guardarZip(path_fichero + nombre_fichero, ficheros, true);
    }
}
